from app.models.player import Summoner, Player
from app.models.ranked_stats import RankedStats
from app.utils.net_request_util import NetRequestUtil
from typing import Any, Dict

"""
与玩家信息相关的方法
"""
lcu_request = NetRequestUtil()


def from_dict(data_class: Any, data: Dict[str, Any]) -> Any:
    """
    将字典数据转换为数据类实例，并过滤掉数据类中未定义的字段。

    :param data_class: 数据类
    :param data: 字典数据
    :return: 数据类实例
    """
    # 获取数据类中定义的属性名
    class_field_names = {f.name for f in data_class.__dataclass_fields__.values()}

    # 过滤字典中不存在于数据类属性中的字段
    filtered_data = {k: v for k, v in data.items() if k in class_field_names}

    return data_class(**filtered_data)


def print_api_res(response):
    """
    打印接口返回的信息
    :param response: 接口返回的json串
    :return: True表示接口正常返回，false表示接口异常
    """
    # 获取状态码
    status_code = response.status_code
    # 获取url
    url = response.url
    print(f"api = {url}, status_code = {status_code}")

    if status_code != 200:
        return False
    return True


def get_logged_player():
    """
    获取已登录riot客户端的召唤师信息
    :return:
    """
    response = lcu_request.get("/lol-login/v1/session")
    # TODO 可以进行异常处理
    res_status = print_api_res(response)

    # 处理json数据
    summoner = from_dict(Summoner, response.json())

    return summoner


def get_player(puuid):
    """
    通过puuid获取玩家信息
    :param puuid:
    :return:
    """
    response = lcu_request.get(f"/lol-summoner/v2/summoners/puuid/{puuid}")
    print_api_res(response)
    # 创建 Player 实例用于返回
    player = from_dict(Player, response.json())

    return player


def ranked_stats(puuid):
    """
    通过puuid获取玩家段位信息
    :param puuid:
    :return:
    """
    response = lcu_request.get(f'/lol-ranked/v1/ranked-stats/{puuid}')
    print_api_res(response)
    rankedStats = from_dict(RankedStats, response.json())

    return rankedStats


if __name__ == "__main__":
    # print(get_player('ee639917-6a3c-5726-949f-537d341e5022'))
    # print(get_logged_player())
    print(ranked_stats('ee639917-6a3c-5726-949f-537d341e5022'))

"""
json.dump(obj, fp) 将python数据类型转换并保存到json格式的文件内
json.dumps(obj) 将python数据类型转换为json格式的字符串
json.load(fp) 从json格式的文件中读取数据并转换为python的类型
json.loads(s) 将json格式的字符串转换为python的类型
"""






